package com.ruoyi.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ConvertUtil {
	private SimpleDateFormat sdfLongTime = new SimpleDateFormat("yyyyMMddHHmmss");
	private SimpleDateFormat sdfLongTimePlus = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private SimpleDateFormat sdfShortDatePlus = new SimpleDateFormat("yyyy-MM-dd");

	public static boolean IntToBoolean(int value) {
		return value > 0;
	}

	/**
	 * int转Boolean
	 * 
	 * @param value 待转换整型值
	 * @return boolean 结果
	 */
	public static boolean Int2B(int value) {
		return value > 0;
	}

	/**
	 * int转String
	 * 
	 * @param value 待转换整型值
	 * @return boolean 结果
	 */
	public static String Int2S(int value) {
		return String.valueOf(value);
	}

	/**
	 * BigDecimal转String（货币值转换，小数点保留2位）
	 * 
	 * @param value 待转换整型值
	 * @return boolean 结果
	 */
	public static String Money2S(BigDecimal value) {
		if (value == null) {
			return StringUtils.EMPTY;
		}
		value = value.setScale(2, RoundingMode.HALF_UP);
		return value.toString();
	}

	/**
	 * String转BigDecimal
	 * 
	 * @param value 待转换字符串
	 * @return BigDecimal 结果
	 */
	public static BigDecimal S2Money(String value) {
		if (StringUtils.isBlank(value)) {
			return null;
		}
		return new BigDecimal(value);
	}

	/**
	 * string转Boolean
	 * 
	 * @param value 待转换的字符串
	 * @return boolean 结果
	 */
	public static boolean Str2B(String value) {
		if (StringUtils.isBlank(value)) {
			return false;
		}

		return value.equals("1") || value.equalsIgnoreCase("true");
	}

	/**
	 * String 转 int
	 * 
	 * @param strValue String 待转换的字符串
	 * @return int 转换完成的整型
	 */
	public static int Str2I(String strValue) {
		if (null == strValue) {
			return 0;
		}
		int iValue = 0;
		try {
			iValue = Integer.parseInt(strValue.trim());
		} catch (Exception ex) {
			iValue = 0;
		}
		return iValue;
	}

	/**
	 * String 转 TimeStamp
	 * 
	 * @param strValue String 待转换的字符串
	 * @return Timestamp
	 */
	public static Timestamp Str2TS(String strValue) {
		try {
			if (StringUtils.isBlank(strValue)) {
				return null;
			}

			return Timestamp.valueOf(strValue);
		} catch (Exception e) {
			return null;
		}
	}


	/**
	 * TimeStamp 转 String（格式：yyyy-MM-dd HH:mm:ss）
	 * 
	 * 待转换时间
	 * @return String
	 */
	public static String TS2Str(Timestamp value) {
		if (value == null) {
			return StringUtils.EMPTY;
		}

		DateFormat sdf = new ConvertUtil().sdfLongTimePlus;
		try {
			return sdf.format(value);
		} catch (Exception e) {
			return StringUtils.EMPTY;
		}
	}


	/**
	 * String 转 long
	 * 
	 * @param strValue String 待转换的字符串
	 * @return long 转换完成的长整型
	 */
	public static long StrToLong(String strValue) {
		if (null == strValue) {
			return 0;
		}
		long lValue = 0;
		try {
			lValue = Long.parseLong(strValue.trim());
		} catch (Exception ex) {
			lValue = 0;
		}
		return lValue;
	}

	/**
	 * String 转 long
	 * 
	 * @param strValue String 待转换的字符串
	 * @return long 转换完成的长整型
	 */
	public static long Str2L(String strValue) {
		if (null == strValue) {
			return 0;
		}
		long lValue = 0;
		try {
			lValue = Long.parseLong(strValue);
		} catch (Exception ex) {
			lValue = 0;
		}
		return lValue;
	}

	/**
	 * long 转 String
	 * 
	 * @param value 长整型
	 * @return String 结果
	 */
	public static String L2Str(long value) {
		return Long.toString(value);
	}

	/**
	 * Date 转 时间戳格式String （yyyyMMddHHmmss）
	 * 
	 *  strValue String 待转换的字符串
	 * @return String
	 */
	public static String Date2StampStr(Date date) {
		try {
			String timeStr = "";
			date = new java.sql.Date(date.getTime());
			timeStr = new ConvertUtil().sdfLongTime.format(date);
			return timeStr;
		} catch (Exception e) {
			return StringUtils.EMPTY;
		}
	}

	/**
	 * Date 转 字符串 （yyyy-MM-dd HH:mm:ss）
	 * 
	 * strValue String 待转换的字符串
	 * @return String
	 */
	public static String Date2Str(Date date) {
		try {
			String timeStr = StringUtils.EMPTY;
			date = new java.sql.Date(date.getTime());
			timeStr = new ConvertUtil().sdfLongTimePlus.format(date);
			return timeStr;
		} catch (Exception e) {
			return StringUtils.EMPTY;
		}
	}

	/**
	 * Date 转 字符串 （yyyy-MM-dd）
	 * 
	 * strValue String 待转换的字符串
	 * @return String
	 */
	public static String Date2ShortStr(Date date) {
		if (date == null) {
			return StringUtils.EMPTY;
		}

		try {
			String timeStr = StringUtils.EMPTY;
			date = new java.sql.Date(date.getTime());
			timeStr = new ConvertUtil().sdfShortDatePlus.format(date);
			return timeStr;
		} catch (Exception e) {
			return StringUtils.EMPTY;
		}
	}

	/**
	 * Timestamp 转 Date
	 * 
	 * @param value 长整型
	 * @return String 结果
	 */
	public static Date TimestampToDate(Timestamp value) {
		if (value == null) {
			return null;
		}
		Date date = new Date();
		try {
			date = value;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 将毫秒数 转成 Timestamp（yyyy-MM-dd HH:mm:ss）
	 * 
	 * strValue String 待转换的字符串
	 * @return String
	 */
	public static Timestamp TimeMill2Timestamp(long timemill) {
		String sDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
				.format(new Date(timemill * 1000));

		return Timestamp.valueOf(sDate);
	}

	public static Timestamp TimeMill2Timestamp(String timemill) {
		if (StringUtils.isBlank(timemill)) {
			return null;
		}
		long longTimemill = Str2L(timemill);

		return TimeMill2Timestamp(longTimemill);
	}

	/**
	 * 将毫秒数 转成 Timestamp（yyyy-MM-dd HH:mm:ss.SSS）
	 * 
	 * strValue String 待转换的字符串
	 * @return String
	 */
	public static Timestamp TimeMill2LongTimestamp(long timemill) {
		String sDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(timemill));

		return Timestamp.valueOf(sDate);
	}

	/**
	 * 将Unix时间戳转换成Timestamp
	 * 
	 * strValue String 待转换的字符串
	 * @return String
	 */
	public static Timestamp UTS2TS(String timemill) {
		if (StringUtils.isBlank(timemill)) {
			return null;
		}
		try {
			if (timemill.length() == 10) {
				return TimeMill2Timestamp(timemill);
			}else if (timemill.length() == 13) {
				return TimeMill2LongTimestamp(Str2L(timemill));
			}else {
				return null;
			}
		} catch (Exception e) {
			return null;
		}
	}

	public static Timestamp UTS2TS(long timemill) {
		return UTS2TS(L2Str(timemill));
	}

	/**
	 * 将Timestamp 转成 Unix时间戳（13位毫秒格式）
	 * 
	 * Timestamp ts 待转换的TS
	 * @return String
	 */
	public static long TS2UTS(Timestamp ts) {
		if (ts == null) {
			return 0;
		}
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		String str = dateFormat.format(ts);

		// 此处转换为毫秒数
		long millionSeconds = 0;
		try {
			millionSeconds = dateFormat.parse(str).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return millionSeconds;
	}

	/**
	 * 转换为String数组<br>
	 * 
	 * @param str 被转换的值
	 * @return 结果
	 */
	public static String[] toStrArray(String str) {
		return toStrArray(",", str);
	}

	/**
	 * 转换为String数组<br>
	 * 
	 * @param split 分隔符
	 * @param split 被转换的值
	 * @return 结果
	 */
	public static String[] toStrArray(String split, String str) {
		return str.split(split);
	}

}
